package builderdto

import (
	"yunj/pkg/yunj/core/response"

	"github.com/worklz/go-validate"
)

// 表格状态栏项
type TableState struct {
	Code  any    `json:"code"`
	Title string `json:"title"`
}

// 排序参数
type TableSort struct {
	validate.Validator `json:"-"`
	Field              string `json:"field"`
	Type               string `json:"type"`
}

func (s *TableSort) DefineRules() map[string]interface{} {
	return map[string]interface{}{
		"field": "required",
		"type":  "required|in:ASC,DESC",
	}
}

func (s *TableSort) DefineMessages() map[string]string {
	return map[string]string{
		"field.required": "排序字段不能为空",
		"field.in":       "排序字段错误",
		"type.required":  "排序类型字段不能为空",
		"type.in":        "排序类型字段错误",
	}
}

// 导出参数
type TableExport struct {
	validate.Validator `json:"-"`
	Filename           string   `json:"filename"`
	FileExt            string   `json:"file_ext"`
	Fields             []string `json:"fields"`
	FieldTitles        []string `json:"field_titles"`
	ApiUrl             string   `json:"api_url"`
	IsEnablePage       bool     `json:"is_enable_page"` // 是否启用分页
}

func (e *TableExport) DefineRules() map[string]interface{} {
	return map[string]interface{}{
		"filename": "required|chsDashChar",
		"file_ext": "required|in:xlsx",
	}
}

func (e *TableExport) DefineMessages() map[string]string {
	return map[string]string{
		"filename.required":    "导出文件名不能为空",
		"filename.chsDashChar": "导出文件名仅允许汉字/字母/数字/下划线_/破折号-/中文符号组合",
		"file_ext.required":    "导出文件格式不能为空",
		"file_ext.in":          "导出文件格式选择错误",
		"fields.required":      "请选择导出字段",
		"fields.arrayIn":       "导出字段选择异常，刷新页面后重试",
	}
}

// items操作返回结果
type TableCountResult struct {
	Count int64 `json:"count"`
}

// items操作返回结果
type TableItemsResult struct {
	Items          any  `json:"items"`
	ExpandTreeNode bool `json:"expand_tree_node"` // 展开树节点
}

// event操作返回结果
type TableEventResult struct {
	Reload           bool               `json:"reload"` // 是否重新加载列表数据
	Message          string             `json:"-"`      // 提示消息
	ResponseJsonData *response.JsonData `json:"-"`
}

// 将map[string]any转换为EventResult
func (res *TableEventResult) MapTo(data map[string]any) {
	if reloadRaw, exists := data["reload"]; exists {
		if reload, ok := reloadRaw.(bool); ok {
			res.Reload = reload
		}
	}
	if responseJsonDataRaw, exists := data["responseJsonData"]; exists {
		if responseJsonData, ok := responseJsonDataRaw.(*response.JsonData); ok && responseJsonData != nil {
			res.ResponseJsonData = responseJsonData
		}
	}
}

// 默认操作栏到处操作，可选导出字段项
type TableExportField struct {
	Field string `json:"field"`
	Title string `json:"title"`
	Auth  string `json:"auth"`
}

// 表头列选项
type TableColOption struct {
	Value     any    `json:"value"`      // 选项值
	Label     string `json:"label"`      // 选项label
	FullLabel string `json:"full_label"` // 选项全称（显示在标签title，或导出时使用）
	BgColor   string `json:"bgColor"`    // 选项背景颜色
}
